package org.sam.swing.table.verification;

import org.sam.swing.table.JSTableColumn;
import org.sam.swing.table.JSTableModel;

/**
 * 所有校验对象的抽象基类 实现了一些基本方法
 * 
 * @author sam
 *
 */
public abstract class AbstractVerificatior implements Verificatior {

	/**
	 * 当前验证器依靠的父对象
	 */
	protected JSTableColumn column;

	/**
	 * 当前的系统显示文本
	 */
	protected String msg = "校验失败";

	/**
	 * 所有校验对象的抽象基类 实现了一些基本方法
	 */
	public AbstractVerificatior() {

	}

	/**
	 * 所有校验对象的抽象基类 实现了一些基本方法
	 * 
	 * @param message
	 *            提示文本
	 */
	public AbstractVerificatior(String message) {
		this.setMsg(message);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public JSTableColumn getParent() {
		return column;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public void setParent(JSTableColumn column) {
		this.column = column;
	}

	/**
	 * 当前的校验文本
	 * 
	 * @return
	 */
	protected String getMsg() {
		return msg;
	}

	/**
	 * 当前的校验文本
	 * 
	 * @return
	 */
	protected void setMsg(String msg) {
		this.msg = msg;
	}

	/**
	 * 校验输入项目是否满足条件
	 * 
	 * @param model
	 * @param row
	 * @return
	 */
	protected boolean checkInput(JSTableModel<?> model, int row, int column) {
		if (model == null)
			throw new NullPointerException("tableModel is null");

		if (row < 0 || row >= model.getRowCount())
			throw new IndexOutOfBoundsException("row index is overflow");

		if (this.getParent() == null)
			throw new NullPointerException("parent is null");

		// 不是本列则不校验
		if (this.getParent().getModelIndex() != column)
			return false;

		return true;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getMsg(JSTableModel<?> model, int row) {
		return this.msg;
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public boolean check(JSTableModel<?> model, int row) {

		if (this.getParent() == null)
			throw new NullPointerException("parent is null");

		if (!this.checkInput(model, row, this.getParent().getModelIndex()))
			return false;

		return this.check(model, row, this.getParent().getModelIndex());
	}
	
	

	@Override
	public boolean check(JSTableModel<?> model, int row, int column) {
		if (!this.checkInput(model, row, column))
			return false;
		
		Object v = model.getValueAt(row, column);
		return this.verificat(v);
	}

	/**
	 * {@inheritDoc}
	 */
	@Override
	public String getMsg(JSTableModel<?> model, int row, int column) {
		return this.msg;
	}

}
